<!doctype html>
<html class="no-js" lang="">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title>angular-oauth2-oidc</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <link rel="icon" type="image/x-icon" href="./images/favicon.ico">
	      <link rel="stylesheet" href="./styles/style.css">
    </head>
    <body>

        <div class="navbar navbar-default navbar-fixed-top visible-xs">
            <a href="./" class="navbar-brand">angular-oauth2-oidc</a>
            <button type="button" class="btn btn-default btn-menu ion-ios-menu" id="btn-menu"></button>
        </div>

        <div class="xs-menu menu" id="mobile-menu">
                <div id="book-search-input" role="search"><input type="text" placeholder="Type to search"></div>            <compodoc-menu></compodoc-menu>
        </div>

        <div class="container-fluid main">
           <div class="row main">
               <div class="hidden-xs menu">
                   <compodoc-menu mode="normal"></compodoc-menu>
               </div>
               <!-- START CONTENT -->
               <div class="content getting-started">
                   <div class="content-data">

<h1 id="angular-oauth2-oidc">angular-oauth2-oidc</h1>
<p>Support for OAuth 2 and OpenId Connect (OIDC) in Angular. Already prepared for the upcoming OAuth 2.1.</p>
<p><img src="https://raw.githubusercontent.com/manfredsteyer/angular-oauth2-oidc/master/oidc.png" alt="OIDC Certified Logo" class="img-responsive"></p>
<h2 id="credits">Credits</h2>
<ul>
<li><a href="https://kjur.github.io/jsrsasign/">jsrasign</a> for validating token signature and for hashing</li>
<li><a href="https://github.com/identityserver">Identity Server</a> for testing with an .NET/.NET Core Backend</li>
<li><a href="http://www.keycloak.org/">Keycloak (Redhat)</a> for testing with Java</li>
<li><a href="https://auth0.com/">Auth0</a></li>
</ul>
<h2 id="resources">Resources</h2>
<ul>
<li>Sources and Sample: <a href="https://github.com/manfredsteyer/angular-oauth2-oidc">https://github.com/manfredsteyer/angular-oauth2-oidc</a></li>
<li>Source Code Documentation: <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs">https://manfredsteyer.github.io/angular-oauth2-oidc/docs</a></li>
<li>Community-provided sample implementation: <a href="https://github.com/jeroenheijmans/sample-angular-oauth2-oidc-with-auth-guards/">https://github.com/jeroenheijmans/sample-angular-oauth2-oidc-with-auth-guards/</a></li>
</ul>
<h2 id="breaking-change-in-version-9">Breaking Change in Version 9</h2>
<p>With regards to tree shaking, beginning with version 9, the <code>JwksValidationHandler</code> has been moved to a library of its own. If you need it for implementing <strong>implicit flow</strong>, please install it using npm:</p>
<div><pre class="line-numbers"><code class="language-none">npm i angular-oauth2-oidc-jwks --save</code></pre></div><p>After that, you can import it into your application by using this:</p>
<div><pre class="line-numbers"><code class="language-typescript">import { JwksValidationHandler } from &#39;angular-oauth2-oidc-jwks&#39;;</code></pre></div><p>instead of that:</p>
<div><pre class="line-numbers"><code class="language-typescript">import { JwksValidationHandler } from &#39;angular-oauth2-oidc&#39;;</code></pre></div><p>Please note, that this dependency is not needed for the <strong>code flow</strong>, which is nowadays the <strong>recommended</strong> flow for single page applications. This also results in smaller bundle sizes.</p>
<h3 id="breaking-change-in-910">Breaking change in 9.1.0</h3>
<p>The use of <code>encodeURIComponent</code> on the argument passed to <code>initImplicitFlow</code> and its Code Flow counterparts was mandatory before this version.</p>
<p>Since that was considered a <em>bug</em>, the need to do so was removed.
Now the reverse is true <strong>if you&#39;re upgrading from before 9.0.0</strong>: you need to remove any call to encode URI components in your own application, as the library will now do it for you.</p>
<h2 id="tested-environment">Tested Environment</h2>
<p>Successfully tested with <strong>Angular 9</strong> and its Router, PathLocationStrategy as well as HashLocationStrategy and CommonJS-Bundling via webpack. At server side we&#39;ve used IdentityServer (.NET / .NET Core), Redhat&#39;s Keycloak (Java), and Auth0 (Auth0 is officially supported since version 10 of this lib). For Auth0, please have a look into the respective documentation page here.</p>
<p>Also, the Okta community created some guidelines on how to use this lib with Okta. See the links at the end of this page for more information.</p>
<p><strong>Angular 10</strong>: Use 10.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 9</strong>: Use 9.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 8</strong>: Use 8.x versions of this library.</p>
<p><strong>Angular 7</strong>: Use 7.x versions of this library.</p>
<p><strong>Angular 6</strong>: Use Version 4.x of this library. Version 4.x was tested with Angular 6. You can also try the newer version 5.x of this library which has a much smaller bundle size.</p>
<p><strong>Angular 5.x or 4.3</strong>: If you need support for Angular &lt; 6 (4.3 to 5.x) you can download the former version 3.1.4 (npm i angular-oauth2-oidc@^3 --save).</p>
<h2 id="release-cycle">Release Cycle</h2>
<ul>
<li>We plan one major release for each Angular version<ul>
<li>Will contain new features</li>
<li>Will contain bug fixes and PRs</li>
</ul>
</li>
<li>Critical bugfixes on demand</li>
</ul>
<h2 id="contributions">Contributions</h2>
<ul>
<li><p>Feel free to file pull requests</p>
</li>
<li><p>The issues contain some ideas for PRs and enhancements (see labels)</p>
</li>
<li><p>If you want to contribute to the docs, you can do so in the <code>docs-src</code> folder. Make sure you update <code>summary.json</code> as well. Then generate the docs with the following commands:</p>
<div><pre class="line-numbers"><code class="language-sh">npm install -g &#64;compodoc/compodoc
npm run docs</code></pre></div></li>
</ul>
<h2 id="features">Features</h2>
<ul>
<li>Logging in via Code Flow + PKCE<ul>
<li>Hence, you are safe for the upcoming OAuth 2.1</li>
</ul>
</li>
<li>Logging in via Implicit Flow (where a user is redirected to Identity Provider)</li>
<li>&quot;Logging in&quot; via Password Flow (where a user enters their password into the client)</li>
<li>Token Refresh for all supported flows</li>
<li>Automatically refreshing a token when/some time before it expires</li>
<li>Querying Userinfo Endpoint</li>
<li>Querying Discovery Document to ease configuration</li>
<li>Validating claims of the id_token regarding the specs</li>
<li>Hook for further custom validations</li>
<li>Single-Sign-Out by redirecting to the auth-server&#39;s logout-endpoint</li>
<li>Tested with all modern browsers and IE</li>
<li>Token Revocation according to <a href="https://tools.ietf.org/html/rfc7009#section-2.2">RFC 7009</a></li>
</ul>
<h2 id="sample-auth-server">Sample-Auth-Server</h2>
<p>You can use the OIDC-Sample-Server used in our examples. It assumes, that your Web-App runs on <a href="http://localhost:4200">http://localhost:4200</a></p>
<p>Username/Password:</p>
<ul>
<li>max/geheim</li>
<li>bob/bob</li>
<li>alice/alice</li>
</ul>
<p><em>clientIds:</em></p>
<ul>
<li>spa (Code Flow + PKCE)</li>
<li>implicit (implicit flow)</li>
</ul>
<p><em>redirectUris:</em></p>
<ul>
<li>localhost:[4200-4202]</li>
<li>localhost:[4200-4202]/index.html</li>
<li>localhost:[4200-4202]/silent-refresh.html</li>
</ul>
<h2 id="installing">Installing</h2>
<div><pre class="line-numbers"><code class="language-sh">npm i angular-oauth2-oidc --save</code></pre></div><h2 id="importing-the-ngmodule">Importing the NgModule</h2>
<div><pre class="line-numbers"><code class="language-TypeScript">import { HttpClientModule } from &#39;&#64;angular/common/http&#39;;
import { OAuthModule } from &#39;angular-oauth2-oidc&#39;;
// etc.

&#64;NgModule({
  imports: [
    // etc.
    HttpClientModule,
    OAuthModule.forRoot()
  ],
  declarations: [
    AppComponent,
    HomeComponent,
    // etc.
  ],
  bootstrap: [
    AppComponent
  ]
})
export class AppModule {
}</code></pre></div><h1 id="logging-in">Logging in</h1>
<p>Since Version 8, this library supports code flow and <a href="https://tools.ietf.org/html/rfc7636">PKCE</a> to align with the current draft of the <a href="https://tools.ietf.org/html/draft-ietf-oauth-security-topics-13">OAuth 2.0 Security Best Current Practice</a> document. This is also the foundation of the upcoming OAuth 2.1.</p>
<p>To configure your solution for code flow + PKCE you have to set the <code>responseType</code> to <code>code</code>:</p>
<div><pre class="line-numbers"><code class="language-TypeScript">  import { AuthConfig } from &#39;angular-oauth2-oidc&#39;;

  export const authCodeFlowConfig: AuthConfig = {
    // Url of the Identity Provider
    issuer: &#39;https://idsvr4.azurewebsites.net&#39;,

    // URL of the SPA to redirect the user to after login
    redirectUri: window.location.origin + &#39;/index.html&#39;,

    // The SPA&#39;s id. The SPA is registerd with this id at the auth-server
    // clientId: &#39;server.code&#39;,
    clientId: &#39;spa&#39;,

    // Just needed if your auth server demands a secret. In general, this
    // is a sign that the auth server is not configured with SPAs in mind
    // and it might not enforce further best practices vital for security
    // such applications.
    // dummyClientSecret: &#39;secret&#39;,

    responseType: &#39;code&#39;,

    // set the scope for the permissions the client should request
    // The first four are defined by OIDC.
    // Important: Request offline_access to get a refresh token
    // The api scope is a usecase specific one
    scope: &#39;openid profile email offline_access api&#39;,

    showDebugInformation: true,
  };</code></pre></div><p>After this, you can initialize the code flow using:</p>
<div><pre class="line-numbers"><code class="language-TypeScript">this.oauthService.initCodeFlow();</code></pre></div><p>There is also a convenience method <code>initLoginFlow</code> which initializes either the code flow or the implicit flow depending on your configuration.</p>
<div><pre class="line-numbers"><code class="language-TypeScript">this.oauthService.initLoginFlow();</code></pre></div><p>Also -- as shown in the readme -- you have to execute the following code when bootstrapping to make the library to fetch the token:</p>
<div><pre class="line-numbers"><code class="language-TypeScript">this.oauthService.configure(authCodeFlowConfig);
this.oauthService.loadDiscoveryDocumentAndTryLogin();</code></pre></div><h3 id="logging-out">Logging out</h3>
<p>The logOut method clears the used token store (by default <code>sessionStorage</code>) and forwards the user to the auth servers logout endpoint if one was configured (manually or via the discovery document).</p>
<div><pre class="line-numbers"><code class="language-typescript">this.oauthService.logOut();</code></pre></div><p>If you want to revoke the existing access token and the existing refresh token before logging out, use the following method:</p>
<div><pre class="line-numbers"><code class="language-typescript">this.oauthService.revokeTokenAndLogout();</code></pre></div><h3 id="skipping-the-login-form">Skipping the Login Form</h3>
<p>If you don&#39;t want to display a login form that tells the user that they are redirected to the identity server, you can use the convenience function <code>this.oauthService.loadDiscoveryDocumentAndLogin();</code> instead of <code>this.oauthService.loadDiscoveryDocumentAndTryLogin();</code> when setting up the library.</p>
<p>This directly redirects the user to the identity server if there are no valid tokens. Ensure you have your <code>issuer</code> set to your discovery document endpoint!</p>
<h3 id="calling-a-web-api-with-an-access-token">Calling a Web API with an Access Token</h3>
<p>You can automate this task by switching <code>sendAccessToken</code> on and by setting <code>allowedUrls</code> to an array with prefixes for the respective URLs. Use lower case for the prefixes.</p>
<div><pre class="line-numbers"><code class="language-TypeScript">OAuthModule.forRoot({
    resourceServer: {
        allowedUrls: [&#39;http://www.angular.at/api&#39;],
        sendAccessToken: true
    }
})</code></pre></div><p>If you need more versatility, you can look in the <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/working-with-httpinterceptors.html">documentation</a> how to setup a custom interceptor.</p>
<h2 id="token-refresh">Token Refresh</h2>
<p>See docs: <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/refreshing-a-token.html">https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/refreshing-a-token.html</a></p>
<h2 id="routing">Routing</h2>
<p>If you use the <code>PathLocationStrategy</code> (which is on by default) and have a general catch-all-route (<code>path: &#39;**&#39;</code>) you should be fine. Otherwise look up the section <code>Routing with the HashStrategy</code> in the <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs/">documentation</a>.</p>
<h2 id="implicit-flow">Implicit Flow</h2>
<p>Nowadays, using code flow + PKCE -- as shown above -- is the recommended OAuth 2/OIDC flow for SPAs. To use the older implicit flow, lookup this docs: <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/using-implicit-flow.html">https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/using-implicit-flow.html</a></p>
<h2 id="more-documentation-">More Documentation (!)</h2>
<p>See the <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs/">documentation</a> for more information about this library.</p>
<h2 id="tutorials">Tutorials</h2>
<ul>
<li><a href="https://www.softwarearchitekt.at/post/2016/07/03/authentication-in-angular-2-with-oauth2-oidc-and-guards-for-the-newest-new-router-english-version.aspx">Tutorial with Demo Servers available online</a></li>
<li><a href="https://developer.okta.com/blog/2017/04/17/angular-authentication-with-oidc">Angular Authentication with OpenID Connect and Okta in 20 Minutes</a></li>
<li><a href="https://developer.okta.com/blog/2017/06/13/add-authentication-angular-pwa">Add Authentication to Your Angular PWA</a></li>
<li><a href="https://developer.okta.com/blog/2017/08/22/build-an-ionic-app-with-user-authentication">Build an Ionic App with User Authentication</a></li>
<li><a href="https://www.softwarearchitekt.at">On-Site Workshops</a></li>
<li><a href="https://github.com/jeroenheijmans/sample-auth0-angular-oauth2-oidc">Angular 6 with Auth0 using this library</a></li>
</ul>
<h2 id="thanks-to-all-contributors">Thanks to all Contributors</h2>
<p><a href="https://github.com/dorianweidler"><img alt="dorianweidler" src="https://avatars1.githubusercontent.com/u/10262731?v=4&s=117" width="117"></a><a href="https://github.com/wdunn001"><img alt="wdunn001" src="https://avatars0.githubusercontent.com/u/4011100?v=4&s=117" width="117"></a><a href="https://github.com/roblabat"><img alt="roblabat" src="https://avatars3.githubusercontent.com/u/9885738?v=4&s=117" width="117"></a><a href="https://github.com/drobert-bfm"><img alt="drobert-bfm" src="https://avatars0.githubusercontent.com/u/28102639?v=4&s=117" width="117"></a><a href="https://github.com/mike-rivera"><img alt="mike-rivera" src="https://avatars0.githubusercontent.com/u/57490323?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/luciimon"><img alt="luciimon" src="https://avatars3.githubusercontent.com/u/9714755?v=4&s=117" width="117"></a><a href="https://github.com/killzoner"><img alt="killzoner" src="https://avatars2.githubusercontent.com/u/3322938?v=4&s=117" width="117"></a><a href="https://github.com/filipvh"><img alt="filipvh" src="https://avatars3.githubusercontent.com/u/6095002?v=4&s=117" width="117"></a><a href="https://github.com/darbio"><img alt="darbio" src="https://avatars0.githubusercontent.com/u/517620?v=4&s=117" width="117"></a><a href="https://github.com/akkaradej"><img alt="akkaradej" src="https://avatars3.githubusercontent.com/u/2855965?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/Gimly"><img alt="Gimly" src="https://avatars0.githubusercontent.com/u/168669?v=4&s=117" width="117"></a><a href="https://github.com/Varada-Schneider"><img alt="Varada-Schneider" src="https://avatars0.githubusercontent.com/u/62388762?v=4&s=117" width="117"></a><a href="https://github.com/vadjs"><img alt="vadjs" src="https://avatars1.githubusercontent.com/u/10026333?v=4&s=117" width="117"></a><a href="https://github.com/srenatus"><img alt="srenatus" src="https://avatars3.githubusercontent.com/u/870638?v=4&s=117" width="117"></a><a href="https://github.com/SpazzMarticus"><img alt="SpazzMarticus" src="https://avatars0.githubusercontent.com/u/5716457?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/scttcper"><img alt="scttcper" src="https://avatars3.githubusercontent.com/u/1400464?v=4&s=117" width="117"></a><a href="https://github.com/ryanmwright"><img alt="ryanmwright" src="https://avatars2.githubusercontent.com/u/5000122?v=4&s=117" width="117"></a><a href="https://github.com/RubenVermeulen"><img alt="RubenVermeulen" src="https://avatars2.githubusercontent.com/u/10133445?v=4&s=117" width="117"></a><a href="https://github.com/MrJustreborn"><img alt="MrJustreborn" src="https://avatars0.githubusercontent.com/u/11594586?v=4&s=117" width="117"></a><a href="https://github.com/akehir"><img alt="akehir" src="https://avatars2.githubusercontent.com/u/1078202?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/pmccloghrylaing"><img alt="pmccloghrylaing" src="https://avatars3.githubusercontent.com/u/2329335?v=4&s=117" width="117"></a><a href="https://github.com/peterneave"><img alt="peterneave" src="https://avatars0.githubusercontent.com/u/7982708?v=4&s=117" width="117"></a><a href="https://github.com/bechhansen"><img alt="bechhansen" src="https://avatars2.githubusercontent.com/u/426810?v=4&s=117" width="117"></a><a href="https://github.com/hellerbarde"><img alt="hellerbarde" src="https://avatars0.githubusercontent.com/u/37417?v=4&s=117" width="117"></a><a href="https://github.com/OskarsPakers"><img alt="OskarsPakers" src="https://avatars1.githubusercontent.com/u/3343347?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/oleersoy"><img alt="oleersoy" src="https://avatars3.githubusercontent.com/u/1163873?v=4&s=117" width="117"></a><a href="https://github.com/l1b3r"><img alt="l1b3r" src="https://avatars2.githubusercontent.com/u/6207227?v=4&s=117" width="117"></a><a href="https://github.com/nhumblot"><img alt="nhumblot" src="https://avatars1.githubusercontent.com/u/15015617?v=4&s=117" width="117"></a><a href="https://github.com/mdaehnert"><img alt="mdaehnert" src="https://avatars0.githubusercontent.com/u/1017301?v=4&s=117" width="117"></a><a href="https://github.com/anbiniyar"><img alt="anbiniyar" src="https://avatars1.githubusercontent.com/u/407653?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/anoordende"><img alt="anoordende" src="https://avatars0.githubusercontent.com/u/11973801?v=4&s=117" width="117"></a><a href="https://github.com/ArsProgramma"><img alt="ArsProgramma" src="https://avatars1.githubusercontent.com/u/4572729?v=4&s=117" width="117"></a><a href="https://github.com/bobvandevijver"><img alt="bobvandevijver" src="https://avatars1.githubusercontent.com/u/1835343?v=4&s=117" width="117"></a><a href="https://github.com/ErazerBrecht"><img alt="ErazerBrecht" src="https://avatars2.githubusercontent.com/u/6287467?v=4&s=117" width="117"></a><a href="https://github.com/Chris3773"><img alt="Chris3773" src="https://avatars1.githubusercontent.com/u/22506071?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/ChristianMurphy"><img alt="ChristianMurphy" src="https://avatars3.githubusercontent.com/u/3107513?v=4&s=117" width="117"></a><a href="https://github.com/enterprisebug"><img alt="enterprisebug" src="https://avatars1.githubusercontent.com/u/1539741?v=4&s=117" width="117"></a><a href="https://github.com/dirkbolte"><img alt="dirkbolte" src="https://avatars2.githubusercontent.com/u/1572945?v=4&s=117" width="117"></a><a href="https://github.com/mhyfritz"><img alt="mhyfritz" src="https://avatars2.githubusercontent.com/u/718983?v=4&s=117" width="117"></a><a href="https://github.com/FabienDehopre"><img alt="FabienDehopre" src="https://avatars3.githubusercontent.com/u/97023?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/MisterJames"><img alt="MisterJames" src="https://avatars3.githubusercontent.com/u/1197383?v=4&s=117" width="117"></a><a href="https://github.com/JessePreiner"><img alt="JessePreiner" src="https://avatars3.githubusercontent.com/u/3847360?v=4&s=117" width="117"></a><a href="https://github.com/jesusbotella"><img alt="jesusbotella" src="https://avatars2.githubusercontent.com/u/4319728?v=4&s=117" width="117"></a><a href="https://github.com/saxicek"><img alt="saxicek" src="https://avatars2.githubusercontent.com/u/1708442?v=4&s=117" width="117"></a><a href="https://github.com/lukasmatta"><img alt="lukasmatta" src="https://avatars3.githubusercontent.com/u/4323927?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/Maximaximum"><img alt="Maximaximum" src="https://avatars2.githubusercontent.com/u/5593500?v=4&s=117" width="117"></a><a href="https://github.com/mpbalmeida"><img alt="mpbalmeida" src="https://avatars3.githubusercontent.com/u/516102?v=4&s=117" width="117"></a><a href="https://github.com/mraible"><img alt="mraible" src="https://avatars3.githubusercontent.com/u/17892?v=4&s=117" width="117"></a><a href="https://github.com/jeroenhinfi"><img alt="jeroenhinfi" src="https://avatars3.githubusercontent.com/u/38323074?v=4&s=117" width="117"></a><a href="https://github.com/dennisameling"><img alt="dennisameling" src="https://avatars1.githubusercontent.com/u/17739158?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/tpeter1985"><img alt="tpeter1985" src="https://avatars0.githubusercontent.com/u/16336536?v=4&s=117" width="117"></a><a href="https://github.com/StefanoChiodino"><img alt="StefanoChiodino" src="https://avatars1.githubusercontent.com/u/1428893?v=4&s=117" width="117"></a><a href="https://github.com/gingters"><img alt="gingters" src="https://avatars2.githubusercontent.com/u/755148?v=4&s=117" width="117"></a><a href="https://github.com/remiburtin"><img alt="remiburtin" src="https://avatars0.githubusercontent.com/u/4236675?v=4&s=117" width="117"></a><a href="https://github.com/paulyoder"><img alt="paulyoder" src="https://avatars3.githubusercontent.com/u/224111?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/marvinosswald"><img alt="marvinosswald" src="https://avatars1.githubusercontent.com/u/1621844?v=4&s=117" width="117"></a><a href="https://github.com/martin1cerny"><img alt="martin1cerny" src="https://avatars1.githubusercontent.com/u/773078?v=4&s=117" width="117"></a><a href="https://github.com/ManuelRauber"><img alt="ManuelRauber" src="https://avatars0.githubusercontent.com/u/740791?v=4&s=117" width="117"></a><a href="https://github.com/jfyne"><img alt="jfyne" src="https://avatars1.githubusercontent.com/u/400281?v=4&s=117" width="117"></a><a href="https://github.com/linjie997"><img alt="linjie997" src="https://avatars3.githubusercontent.com/u/23615368?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/jdgeier"><img alt="jdgeier" src="https://avatars2.githubusercontent.com/u/949299?v=4&s=117" width="117"></a><a href="https://github.com/Gregordy"><img alt="Gregordy" src="https://avatars3.githubusercontent.com/u/10693717?v=4&s=117" width="117"></a><a href="https://github.com/enricodeleo"><img alt="enricodeleo" src="https://avatars1.githubusercontent.com/u/3534555?v=4&s=117" width="117"></a><a href="https://github.com/adematte"><img alt="adematte" src="https://avatars1.githubusercontent.com/u/5064637?v=4&s=117" width="117"></a><a href="https://github.com/adrianbenjuya"><img alt="adrianbenjuya" src="https://avatars2.githubusercontent.com/u/17908930?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/ismcagdas"><img alt="ismcagdas" src="https://avatars1.githubusercontent.com/u/4133525?v=4&s=117" width="117"></a><a href="https://github.com/maxisam"><img alt="maxisam" src="https://avatars2.githubusercontent.com/u/456807?v=4&s=117" width="117"></a><a href="https://github.com/Razzeee"><img alt="Razzeee" src="https://avatars2.githubusercontent.com/u/5943908?v=4&s=117" width="117"></a><a href="https://github.com/nhance"><img alt="nhance" src="https://avatars3.githubusercontent.com/u/602226?v=4&s=117" width="117"></a><a href="https://github.com/fmalcher"><img alt="fmalcher" src="https://avatars1.githubusercontent.com/u/1683147?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/artnim"><img alt="artnim" src="https://avatars1.githubusercontent.com/u/414375?v=4&s=117" width="117"></a><a href="https://github.com/ajpierson"><img alt="ajpierson" src="https://avatars3.githubusercontent.com/u/56389?v=4&s=117" width="117"></a><a href="https://github.com/Toxicable"><img alt="Toxicable" src="https://avatars3.githubusercontent.com/u/13490925?v=4&s=117" width="117"></a><a href="https://github.com/vdveer"><img alt="vdveer" src="https://avatars2.githubusercontent.com/u/1217814?v=4&s=117" width="117"></a><a href="https://github.com/jeroenheijmans"><img alt="jeroenheijmans" src="https://avatars1.githubusercontent.com/u/1590536?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/manfredsteyer"><img alt="manfredsteyer" src="https://avatars1.githubusercontent.com/u/1573728?v=4&s=117" width="117"></a></p>














                   




                   </div><div class="search-results">
    <div class="has-results">
        <h1 class="search-results-title"><span class='search-results-count'></span> result-matching "<span class='search-query'></span>"</h1>
        <ul class="search-results-list"></ul>
    </div>
    <div class="no-results">
        <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
    </div>
</div>
</div>
               <!-- END CONTENT -->
           </div>
       </div>

       <script>
            var COMPODOC_CURRENT_PAGE_DEPTH = 0;
            var COMPODOC_CURRENT_PAGE_CONTEXT = 'getting-started';
            var COMPODOC_CURRENT_PAGE_URL = 'index.html';
            var MAX_SEARCH_RESULTS = 15;
       </script>

       <script src="./js/libs/custom-elements.min.js"></script>
       <script src="./js/libs/lit-html.js"></script>
       <!-- Required to polyfill modern browsers as code is ES5 for IE... -->
       <script src="./js/libs/custom-elements-es5-adapter.js" charset="utf-8" defer></script>
       <script src="./js/menu-wc.js" defer></script>

       <script src="./js/libs/bootstrap-native.js"></script>

       <script src="./js/libs/es6-shim.min.js"></script>
       <script src="./js/libs/EventDispatcher.js"></script>
       <script src="./js/libs/promise.min.js"></script>
       <script src="./js/libs/zepto.min.js"></script>

       <script src="./js/compodoc.js"></script>

       <script src="./js/tabs.js"></script>
       <script src="./js/menu.js"></script>
       <script src="./js/libs/clipboard.min.js"></script>
       <script src="./js/libs/prism.js"></script>
       <script src="./js/sourceCode.js"></script>
          <script src="./js/search/search.js"></script>
          <script src="./js/search/lunr.min.js"></script>
          <script src="./js/search/search-lunr.js"></script>
          <script src="./js/search/search_index.js"></script>
       <script src="./js/lazy-load-graphs.js"></script>


    </body>
</html>
